#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QtDBus/QDBusConnection>
#include <MediaController>
#include <vkaudioadaptor.h>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    //QDBusConnection connection = QDBusConnection::sessionBus();
    //new MainWindow(this);
    qDebug() << "new Main window";
    //UnityMusicPlayer player;
    ui->setupUi(this);
    isplay = 0;
    model = new QStandardItemModel(this);
    model_search = new QStandardItemModel(this);
    xml_document = new QDomDocument();
    ui->tv_search->setModel(model_search);
    ui->tv_myaudio->setModel(model);
    ui->tv_myaudio->hideColumn(2);  //В TableView скрываем 2(по индексу) колонку, в котором содержется url
    model->setHeaderData(0,Qt::Horizontal,tr("ARTIST"),Qt::DisplayRole); //Изменяем заголовок у 0 столбца
    model->setHeaderData(1,Qt::Horizontal,tr("TITLE"),Qt::DisplayRole); //Изменяем заголовок у 1 столбца


    //Player
    audioOutput = new Phonon::AudioOutput(Phonon::MusicCategory, this);
    Phonon::createPath(&play_track, audioOutput);
    connect(&media, SIGNAL(metaDataChanged()), this, SLOT(onMetadataChanged()));
    seekSlider = new Phonon::SeekSlider(this);
    seekSlider->setMediaObject(&play_track);
    ui->volumeSlider->setAudioOutput(audioOutput);

    //volumeSlider = new Phonon::VolumeSlider(this);
    //volumeSlider->setAudioOutput(audioOutput);
    //volumeSlider->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Maximum);
    ui->gridLayout->addWidget(seekSlider);
    //ui->gridLayout->addWidget(volumeSlider);
    //ui->horizontalLayout_2->addWidget(volumeSlider);
    connect(&play_track,SIGNAL(aboutToFinish()),this,SLOT(next_track()));
    this->load_list();
    qDebug() << "Test";

    request = NULL;
    manager = new QNetworkAccessManager();
    connect(manager,SIGNAL(finished(QNetworkReply*)),this,SLOT(finishSearch(QNetworkReply*)));
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_bt_update_list_clicked()
{
    authdialog auth;
    auth.exec();
    accessToken = auth.getAccessToken();
    this->load_list();
}

void MainWindow::load_list(QString filename)
{
    QFile file (filename);
    if (file.open(QIODevice::ReadOnly))
    {
        if (xml_document->setContent(&file))
        {
            model->clear();
            //Устанавливаем исходный текст с XML
            model->setRowCount(0);
            model->setColumnCount(3);
            ui->tv_myaudio->hideColumn(2); //Скрываем 2 колонку, нужно вызывать метод, при каждой очистке модели

            QDomElement xmlElement = xml_document->documentElement(); //Выбираем первый элемент в xml документе, им является: <response list="true">
            if (xmlElement.attribute("list","") == "true") //Проверяем его атрибут: list
            {
                traverseNode(xmlElement); //Вызываем рекурсивную функцию обработки xml документа. Xml документ представляет собой иерархическую структуру
            }
        }
        model->setHeaderData(0,Qt::Horizontal,tr("ARTIST"),Qt::DisplayRole); //Изменяем заголовок у 0 столбца
        model->setHeaderData(1,Qt::Horizontal,tr("TITLE"),Qt::DisplayRole); //Изменяем заголовок у 1 столбца
        ui->tv_myaudio->resizeColumnsToContents();
    }
    else
    {
        authdialog auth;
        auth.exec();
        this->load_list();
    }
}

void MainWindow::traverseNode(const QDomNode &node)
{
    QDomNode xmlNode = node.firstChild(); //Выбираем первый дочерний элемент, в 1 вызове им является элемент <audio>, при втором вызове им будет <aid>, но его пропускаем и переходим на следующую итерацию цикла
    while(!xmlNode.isNull())
    {
        if (xmlNode.isElement())
        {
            QDomElement xmlElement = xmlNode.toElement();
            if (!xmlElement.isNull())
            {
                if(xmlElement.tagName() == "audio") //Если текущий элементом (блоком) является audio, следовательно добавляем строчку в модель
                {
                    model->insertRow(model->rowCount()); //Добавляем строчку в конец таблицы в модели
                }
                if(xmlElement.tagName() == "artist") //Если текущим элемментом является, элемент который содержит имя артиста, то ставляем его в модель(в 1 столбец, в посленюю строчку)
                {
                    QModelIndex index = model->index(model->rowCount()-1,0,QModelIndex());
                    model->setData(index,xmlElement.text());
                }
                if(xmlElement.tagName() == "title") //Если текущим элемментом является, элемент который содержит имя артиста, то ставляем его в модель(в 1 столбец, в посленюю строчку)
                {
                    QModelIndex index = model->index(model->rowCount()-1,1,QModelIndex());
                    model->setData(index,xmlElement.text());
                }
                if(xmlElement.tagName() == "url") //Если текущим элемментом является, элемент который содержит имя артиста, то ставляем его в модель(в 1 столбец, в посленюю строчку)
                {
                    QModelIndex index = model->index(model->rowCount()-1,2,QModelIndex());
                    model->setData(index,xmlElement.text());
                }
            }
        }
        traverseNode(xmlNode);
        xmlNode = xmlNode.nextSibling();
    }
}

void MainWindow::onMetadataChanged()
{
  /*  int rowcount;
    rowcount = ui->tableWidget->rowCount();
        MetaData = media.metaData(Phonon::ArtistMetaData);
        MetaData << media.metaData(Phonon::AlbumMetaData);
        MetaData << media.metaData(Phonon::TitleMetaData);
        MetaData << media.metaData(Phonon::DateMetaData);
        QTableWidgetItem *artistmp3 = new QTableWidgetItem(QVariant(MetaData.value(0,"")).toString());
        QTableWidgetItem *track = new QTableWidgetItem(QVariant(MetaData.value(1,"")).toString());
        ui->tableWidget->setItem(track_count,0,artistmp3);
        ui->tableWidget->setItem(track_count,1,track);
        track_count++;
        if (track_count<=rowcount-1)
        {
            media.setCurrentSource(Phonon::MediaSource(ui->tableWidget->item(track_count,3)->text()));
        }*/
}

void MainWindow::next_track()
{
    int row_count = model->rowCount();
    QString url_music;
    QModelIndex index;
    if (row_count-1 == track_current)
    {
        track_current = 0;
        index = model->index(track_current,2,QModelIndex());
        url_music = model->data(index,Qt::DisplayRole).toString();
    }
    else
    {
        track_current++;
        index = model->index(track_current,2,QModelIndex());
        url_music = model->data(index,Qt::DisplayRole).toString();
    }
    play_track.setCurrentSource(Phonon::MediaSource(url_music));
    play_track.play();
    ui->tv_myaudio->selectRow(track_current);
    this->indicate();
}

void MainWindow::previous_track()
{
    int row_count = model->rowCount();
    QString url_music;
    QModelIndex index;
    if (track_current == 0)
    {
        track_current = row_count-1;
        index = model->index(track_current,2,QModelIndex());
        url_music = model->data(index,Qt::DisplayRole).toString();
    }
    else
    {
        track_current = track_current-1;
        index = model->index(track_current,2,QModelIndex());
        url_music = model->data(index,Qt::DisplayRole).toString();
    }
    play_track.setCurrentSource(Phonon::MediaSource(url_music));
    play_track.play();
    this->indicate();
    ui->tv_myaudio->selectRow(track_current);
}

void MainWindow::on_bt_play_clicked()
{
    if (track_current != ui->tv_myaudio->currentIndex().row())
    {
        track_current = ui->tv_myaudio->currentIndex().row();
        QModelIndex index = model->index(track_current,2,QModelIndex());
        QString url_music = model->data(index,Qt::DisplayRole).toString();
        play_track.setCurrentSource(Phonon::MediaSource(url_music));
        isplay = 0;
        this->indicate();
    }
    if (isplay == 0)
    {
        play_track.play();
        isplay = 1;
        //ui->bt_play->setText("Pause");
        QIcon iconplay = QIcon(":/res/icons/media-playback-pause.png");
        ui->bt_play->setIcon(iconplay);
    }
    else
    {
        play_track.pause();
        isplay = 0;
        //ui->bt_play->setText("Play");
        QIcon iconplay = QIcon(":/res/icons/media-playback-start.png");
        ui->bt_play->setIcon(iconplay);
    }
}

void MainWindow::indicate()
{
    #if defined(Q_OS_LINUX)
        QModelIndex index;
        QString notify = "notify-send";
        index = model->index(track_current,0,QModelIndex());
        QString artist = model->data(index,Qt::DisplayRole).toString();
        index = model->index(track_current,1,QModelIndex());
        QString title = model->data(index,Qt::DisplayRole).toString();
        QStringList notify_arguments;
        notify_arguments << artist << title;
        QProcess* notify_proc = new QProcess(this);
        notify_proc->start(notify, notify_arguments);
    #endif
}

void MainWindow::on_bt_previous_clicked()
{
    this->previous_track();
    isplay = 1;
    //ui->bt_play->setText("Pause");
    QIcon iconplay = QIcon(":/res/icons/media-playback-pause.png");
    ui->bt_play->setIcon(iconplay);
}

void MainWindow::on_bt_next_clicked()
{
    this->next_track();
    isplay = 1;
    //ui->bt_play->setText("Pause");
    QIcon iconplay = QIcon(":/res/icons/media-playback-pause.png");
    ui->bt_play->setIcon(iconplay);
}

void MainWindow::on_bt_stop_clicked()
{
    play_track.stop();
    isplay = 0;
    QIcon iconplay = QIcon(":/res/icons/media-playback-start.png");
    ui->bt_play->setIcon(iconplay);
}

void MainWindow::track_play(const Phonon::MediaSource&)
{
    if (isplay == 0)
    {
        play_track.play();
        isplay = 1;
    }
    else
    {
        play_track.pause();
        isplay = 0;
    }
}

void MainWindow::keyPressEvent(QKeyEvent *event)
{
    if (event->key() == Qt::Key_MediaNext)
    {
        this->next_track();
        event->accept();
    }
    if (event->key() == Qt::Key_MediaPrevious)
    {
        this->previous_track();
        event->accept();
    }
    if (event->key() == Qt::Key_MediaStop)
    {
        this->on_bt_stop_clicked();
        event->accept();
    }
    if (event->key() == (Qt::Key_MediaPlay || Qt::Key_MediaPause))
    {
        this->on_bt_play_clicked();
        event->accept();
    }
}

void MainWindow::Next()
{
    this->next_track();
}

void MainWindow::on_tv_myaudio_doubleClicked(const QModelIndex &index)
{
    this->on_bt_play_clicked();
}

void MainWindow::MediaPlayerKeyPressed(const QString &in0, const QString &in1)
{
    if (in1 == "Play") this->on_bt_play_clicked();
    if (in1 == "Next") this->on_bt_next_clicked();
    if (in1 == "Previous") this->on_bt_previous_clicked();
    if (in1 == "Stop") this->on_bt_stop_clicked();
}

void MainWindow::finishSearch(QNetworkReply *reply)
{
    qDebug("finishSearch");
    QByteArray byte;
    byte = reply->readAll();

    delete request;
    request = NULL;
    QFile file("searchresult.xml");
    file.open(QIODevice::WriteOnly);
    if(file.isOpen())
    {
        file.write(QString(byte).toLatin1().data());
    }
    file.close();

    reply->deleteLater();

    //КОСТЫЛИ!!!

    model_search->clear();
    //Запоминаем текущий модель и его TableView
    QStandardItemModel *temp_model;
    temp_model = this->model;

    QTableView *tv_temp_view;
    tv_temp_view = ui->tv_myaudio;

    //Производим подмену
    ui->tv_myaudio = ui->tv_search;
    this->model = this->model_search;

    //Загружаем результаты поиска, который грузит уже в нужную модель
    load_list("searchresult.xml");

    //Возвращаем все обратно
    this->model = temp_model;
    ui->tv_myaudio = tv_temp_view;
    temp_model =NULL;
    tv_temp_view = NULL;
    file.remove();
    //КОНЕЦ КОСТЫЛЯМ
}

void MainWindow::on_bt_search_clicked()
{
    //Если accessToken пустой, то вызываем диалог авторизации,
    //для получения кода, что бы использовать  API контакта
    if(accessToken.isEmpty())
    {
        authdialog auth;
        auth.exec();
        accessToken = auth.getAccessToken();
    }
    else
    {
        //Строка поиска
        QUrl vk_searh("https://api.vkontakte.ru/method/audio.search.xml?&sort=2&count=10&access_token="+accessToken+"&q="+ui->ed_searchText->text());
        request =new QNetworkRequest(vk_searh);
        manager->get(*request);
    }
}
